// SPDX-FileCopyrightText: 2023-2025 Sangfor Technologies Inc.
// SPDX-License-Identifier: Mulan PSL v2
//package com.geniusai.aip.auth.controller;
//
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.core.type.TypeReference;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.google.common.base.Charsets;
//import com.geniusai.aip.auth.Securityapplication;
//import com.geniusai.aip.auth.config.ExternalConfig;
//import com.geniusai.aip.auth.domain.ChangePasswordEntity;
//import com.geniusai.aip.auth.domain.EditEntity;
//import com.geniusai.aip.auth.domain.EnvoyFilter;
//import com.geniusai.aip.auth.domain.Profile;
//import com.geniusai.aip.auth.domain.UserDO;
//import com.geniusai.aip.auth.domain.UserVO;
//import com.geniusai.aip.auth.domain.UsersVO;
//import com.geniusai.aip.auth.exception.AuthLoginException;
//import com.geniusai.aip.auth.exception.AuthLoginExceptionEnum;
//import com.geniusai.aip.auth.service.EnvoyFilterService;
//import com.geniusai.aip.auth.service.ProfileService;
//import com.geniusai.aip.auth.service.impl.UserServiceImpl;
//import com.geniusai.aip.feature.common.utils.json.JacksonUtils;
//import com.geniusai.aip.feature.common.web.Response;
//import com.geniusai.aip.feature.common.web.common.PageModel;
//import com.geniusai.aip.feature.common.web.utils.UrlUtils;
//import lombok.extern.slf4j.Slf4j;
//import org.junit.Assert;
//import org.junit.FixMethodOrder;
//import org.junit.Test;
//import org.junit.runner.RunWith;
//import org.junit.runners.MethodSorters;
//import org.mockito.Mockito;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
//import org.springframework.boot.test.context.SpringBootTest;
//import org.springframework.boot.test.mock.mockito.MockBean;
//import org.springframework.http.MediaType;
//import org.springframework.test.context.ActiveProfiles;
//import org.springframework.test.context.junit4.SpringRunner;
//import org.springframework.test.web.servlet.MockMvc;
//import org.springframework.test.web.servlet.MvcResult;
//import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
//import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
//import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.web.client.RestTemplate;
//
//import java.io.UnsupportedEncodingException;
//import java.util.ArrayList;
//
///**
// * @author hml14563
// * @date 2021/4/8
// */
//
//@RunWith(SpringRunner.class)
//@SpringBootTest(classes = Securityapplication.class)
//@AutoConfigureMockMvc
//
//@FixMethodOrder(MethodSorters.NAME_ASCENDING)
//@Slf4j
//@ActiveProfiles("unittest")
//public class UserControllerTest {
//    @Autowired
//    private MockMvc mockMvc;
//
//    @MockBean
//    private ProfileService profileService;
//
//    @MockBean
//    private EnvoyFilterService envoyFilterService;
//
//    @MockBean
//    private RestTemplate restTemplate;
//
//    @MockBean
//    private UserServiceImpl userServiceImpl;
//
//    @Autowired
//    private ExternalConfig externalConfig;
//
//    private ObjectMapper objectMapper = new ObjectMapper();
//
//    @Test
//    public void createMinioUser() throws Exception {
//        UserDO userDO = getUserDO();
//        // 测试创建存储对象
//        String commandStr = String.format(
//                "/opt/aip/add_minio_user_bucket.sh %s %s %s:%s %s %s",
//                userDO.getUserId(),
//                userDO.getPassword(),
//                "http://" + externalConfig.getMinioService(),
//                externalConfig.getMinioServicePort(),
//                userDO.getS3AccessKey(),
//                userDO.getS3SecretKey()
//        );
//        Mockito.doThrow(new AuthLoginException(AuthLoginExceptionEnum.FAIL_CREATE_MINIO_USER)).when(userServiceImpl).execCommand(commandStr);
//        Mockito.doThrow(new AuthLoginException(AuthLoginExceptionEnum.FAIL_CREATE_MINIO_USER)).when(userServiceImpl).createUser(userDO);
//    }
//
//    @Test
//    @Transactional
//    public void testCreateUser() throws Exception {
//        String createURI = "/v1/user";
//        UsersVO user = getUsersVO();
//        String jsonStr = convertToJson(user);
//
//        Profile profile = getProfile(user);
//        Mockito.doNothing().when(profileService).createProfile(profile);
//        EnvoyFilter envoyFilter = getEnvoyFilter(user);
//        Mockito.doNothing().when(envoyFilterService).createEnvoyFilter(user.getUsernames().get(0), envoyFilter);
//        MvcResult mvcResult = mockMvc.perform(
//                MockMvcRequestBuilders.post(createURI).accept(MediaType.APPLICATION_JSON)
//                        .content(jsonStr).contentType(MediaType.APPLICATION_JSON)
//        )
//                .andExpect(MockMvcResultMatchers.status().isOk())
//                .andReturn();
//
//        UsersVO errorUser = getErrorUserVo();
//        String jsonErrorStr = convertToJson(errorUser);
//
//        MvcResult mvcResult1 = mockMvc.perform(
//                MockMvcRequestBuilders.post(createURI).accept(MediaType.APPLICATION_JSON)
//                        .content(jsonErrorStr).contentType(MediaType.APPLICATION_JSON)
//        ).andReturn();
//        Response response = JacksonUtils.toObj(mvcResult1.getResponse().getContentAsString(Charsets.UTF_8), new TypeReference<Response<String>>() {
//        });
//        Assert.assertFalse(response.isSuccess());
//        Assert.assertTrue(response.getMsg().contains("密码格式不正确"));
//        Assert.assertTrue(response.getMsg().contains("cpu的个数为(1,256)非负数"));
//        Assert.assertTrue(response.getMsg().contains("gpu的个数为(0,256)的非负整数"));
//        Assert.assertTrue(response.getMsg().contains("角色判断错误"));
//
//        // get user
//        String getUserURI = "/v1/user";
//        Mockito.doReturn(Response.forSuccessWithData(1)).when(restTemplate)
//                .getForObject(UrlUtils.createUrl(externalConfig.getWebService(), externalConfig.getWebServicePort(), "web/v1/user/{userId}/project:count"), Response.class, "ada");
//
//        MvcResult mvcResult2 = mockMvc.perform(
//                MockMvcRequestBuilders.get(getUserURI).contentType(MediaType.APPLICATION_FORM_URLENCODED)
//                        .param("keyword", "ada")
//                        .param("pageSize", "10")
//                        .param("pageNum", "0")
//        )
//                .andDo(MockMvcResultHandlers.print())
//                .andExpect(MockMvcResultMatchers.status().isOk())
//                .andReturn();
//        Response<PageModel<UserVO>> result1 = JacksonUtils.toObj(mvcResult2.getResponse().getContentAsString(), new TypeReference<Response<PageModel<UserVO>>>() {
//        });
//        if (result1 == null) {
//            log.error("deserialize userVO failed!");
//        }
//        Assert.assertEquals((long) (result1.getData().getTotal()), 1);
//        Assert.assertEquals(result1.getData().getList().get(0).getUsername(), user.getUsernames().get(0));
//
//        // edit user
//        String editURI = "/v1/user/" + result1.getData().getList().get(0).getUserId();
//
//        EditEntity editUser = getEditEntity();
//        profile = getEditProfile(editUser, result1.getData().getList().get(0).getUserId());
//
//        Mockito.doNothing().when(profileService).updateProfile(profile);
//
//        MvcResult mvcResult3 = mockMvc.perform(
//                MockMvcRequestBuilders.put(editURI).accept(MediaType.APPLICATION_JSON)
//                        .content(convertToJson(editUser)).contentType(MediaType.APPLICATION_JSON)
//        )
//                .andExpect(MockMvcResultMatchers.status().isOk())
//                .andReturn();
//        Response<UserVO> userVo = JacksonUtils.toObj(mvcResult3.getResponse().getContentAsString(Charsets.UTF_8), new TypeReference<Response<UserVO>>() {
//        });
//
//        Assert.assertEquals(userVo.getData().getVolumeSize(), editUser.getVolumeSize());
//
//        // change password
//        String changePasswordURI = "/v1/user/" + result1.getData().getList().get(0).getUserId() + "/secret";
//        ChangePasswordEntity entity = getChangeEntity();
//        String jsonStr1 = convertToJson(entity);
//        MvcResult mvcResult4 = mockMvc.perform(
//                MockMvcRequestBuilders.put(changePasswordURI).accept(MediaType.APPLICATION_JSON)
//                        .content(jsonStr1).contentType(MediaType.APPLICATION_JSON)
//        )
//                .andExpect(MockMvcResultMatchers.status().isOk())
//                .andReturn();
//
//        ChangePasswordEntity errorEntity = getErrorChangeEntity();
//        String jsonErrorStr2 = convertToJson(errorEntity);
//        MvcResult mvcResult5 = mockMvc.perform(
//                MockMvcRequestBuilders.put(changePasswordURI).accept(MediaType.APPLICATION_JSON)
//                        .content(jsonErrorStr2).contentType(MediaType.APPLICATION_JSON)
//        )
//                .andReturn();
//        Response result2 = JacksonUtils.toObj(mvcResult5.getResponse().getContentAsString(Charsets.UTF_8), new TypeReference<Response<String>>() {
//        });
//        Assert.assertFalse(result2.isSuccess());
//        Assert.assertTrue(result2.getMsg().contains("密码格式不正确"));
//
//        // delete user
//        String deleteURI = "/v1/user/" + result1.getData().getList().get(0).getUserId();
//
//        Mockito.doNothing().when(profileService).deleteProfile(result1.getData().getList().get(0).getUserId());
//        Mockito.doNothing().when(envoyFilterService).deleteEnvoyFilter(user.getUsernames().get(0));
//        mockMvc.perform(MockMvcRequestBuilders.delete(deleteURI)).andExpect(MockMvcResultMatchers.status().isOk());
//
//    }
//
//    private ChangePasswordEntity getChangeEntity() {
//        ChangePasswordEntity entity = new ChangePasswordEntity();
//        entity.setAccount("ada");
//        entity.setOldPwd("EASY1!@#$");
//        entity.setNewPwd("EASSS1!@#$");
//        return entity;
//    }
//
//    private ChangePasswordEntity getErrorChangeEntity() {
//        ChangePasswordEntity entity = new ChangePasswordEntity();
//        entity.setAccount("ada");
//        entity.setOldPwd("EASY1!@#$");
//        entity.setNewPwd("sangfor1!@#$");
//        return entity;
//    }
//
//    private UsersVO getUsersVO() {
//        UsersVO user = new UsersVO();
//        user.setUsernames(new ArrayList<String>() {
//            {
//                add("ada");
//            }
//        });
//        user.setPassword("EASY1!@#$");
//        user.setCpuNum(1f);
//        user.setVgpuNum(0);
//        user.setVolumeSize(10);
//        user.setVgpuMemory(4);
//        user.setRole(1);
//        return user;
//    }
//
//    private UserDO getUserDO() {
//        UserDO user = new UserDO();
//        user.setUsername("test");
//
//        user.setCpuNum(1f);
//        user.setVgpuNum(0);
//        user.setVolumeSize(10);
//        user.setVgpuMemory(4);
//        user.setRole(1);
//        return user;
//    }
//
//    private Profile getProfile(UsersVO usersVO) {
//        Profile profile = new Profile();
//        profile.setCpuNum(String.valueOf(usersVO.getCpuNum()));
//        profile.setGpuNum(String.valueOf(usersVO.getVgpuNum()));
//        profile.setMemory(String.valueOf(usersVO.getVgpuMemory()));
//        profile.setStorage(String.valueOf(usersVO.getVolumeSize()));
//        profile.setUsername(usersVO.getUsernames().get(0));
//        return profile;
//    }
//
//    private EnvoyFilter getEnvoyFilter(UsersVO usersVO) {
//        EnvoyFilter envoyFilter = new EnvoyFilter();
//        envoyFilter.setNamespace(usersVO.getUsernames().get(0));
//        return envoyFilter;
//    }
//
//    private EditEntity getEditEntity() {
//        EditEntity editEntity = new EditEntity();
//        editEntity.setPassword("");
//        editEntity.setCpuNum(1f);
//        editEntity.setVGpuNum(0);
//        editEntity.setVolumeSize(8);
//        editEntity.setVGpuMemory(4);
//        editEntity.setRole(1);
//        return editEntity;
//    }
//
//    private Profile getEditProfile(EditEntity entity, String username) {
//        Profile profile = new Profile();
//        profile.setCpuNum(String.valueOf(entity.getCpuNum()));
//        profile.setGpuNum(String.valueOf(entity.getVGpuNum()));
//        profile.setMemory(String.valueOf(entity.getVGpuMemory()));
//        profile.setStorage(String.valueOf(entity.getVolumeSize()));
//        profile.setUsername(username);
//        return profile;
//    }
//
//    private UsersVO getErrorUserVo() {
//        UsersVO user = new UsersVO();
//        user.setUsernames(new ArrayList<String>() {
//            {
//                add("ada");
//            }
//        });
//        user.setPassword("admin1!@#$");
//        user.setCpuNum(-1f);
//        user.setVgpuNum(-1);
//        user.setVgpuType("V100");
//        user.setVolumeSize(10);
//        user.setVgpuMemory(4);
//        user.setRole(-1);
//        return user;
//    }
//
//    private Response<UsersVO> deserializeUser(MvcResult mvcResult) throws UnsupportedEncodingException {
//        Response<UsersVO> response = JacksonUtils.toObj(mvcResult.getResponse().getContentAsString(), new TypeReference<Response<UsersVO>>() {
//        });
//        if (response == null) {
//            log.error("deserialize User failed!");
//        }
//        return response;
//    }
//
//    /**
//     * Convert Object into Json String by using Jackson ObjectMapper
//     *
//     * @param object
//     * @return
//     * @throws JsonProcessingException
//     */
//    private String convertToJson(Object object) throws JsonProcessingException {
//        return objectMapper.writeValueAsString(object);
//    }
//}
